#ifndef TEST_FRAMEWORK_H
#define TEST_FRAMEWORK_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/select.h>

// 测试命令定义
#define MAX_CMD_LEN         256
#define MAX_RESPONSE_LEN    1024
#define MAX_THREADS         10
#define CMD_QUEUE_SIZE      50

// 命令类型枚举
typedef enum {
    CMD_PHOTO = 0,          // AT+AIGLASSPHOTO
    CMD_RECORD,             // AT+AIGLASSRECORD  
    CMD_RTSP,               // AT+AIGLASSRTSP
    CMD_WIFI,               // AT+AIGLASSWIFI
    CMD_OTA,                // AT+AIGLASSOTA
    CMD_STATUS,             // AT+AIGLASSSTATUS
    CMD_HELP,               // AT+HELP
    CMD_EXIT,               // AT+EXIT
    CMD_UNKNOWN
} cmd_type_t;

// 命令结构体
typedef struct {
    cmd_type_t type;
    char cmd_string[MAX_CMD_LEN];
    char parameters[MAX_CMD_LEN];
    time_t timestamp;
} test_command_t;

// 命令队列结构体
typedef struct {
    test_command_t commands[CMD_QUEUE_SIZE];
    int head;
    int tail;
    int count;
    pthread_mutex_t mutex;
    pthread_cond_t not_empty;
    pthread_cond_t not_full;
} cmd_queue_t;

// 测试结果枚举
typedef enum {
    TEST_SUCCESS = 0,
    TEST_FAILURE,
    TEST_TIMEOUT,
    TEST_PARAM_ERROR,
    TEST_BUSY,
    TEST_NOT_SUPPORTED
} test_result_t;

// 线程状态枚举
typedef enum {
    THREAD_IDLE = 0,
    THREAD_RUNNING,
    THREAD_BUSY,
    THREAD_ERROR,
    THREAD_STOPPED
} thread_status_t;

// 测试框架状态结构体
typedef struct {
    pthread_t cmd_parser_thread;       // 命令解析线程
    pthread_t cmd_processor_thread;    // 命令处理线程
    pthread_t monitor_thread;          // 监控线程
    
    cmd_queue_t cmd_queue;              // 命令队列
    
    thread_status_t parser_status;     // 解析线程状态
    thread_status_t processor_status;  // 处理线程状态
    thread_status_t monitor_status;    // 监控线程状态
    
    int running;                        // 框架运行标志
    int interactive_mode;               // 交互模式标志
    
    pthread_mutex_t status_mutex;      // 状态保护互斥锁
    pthread_mutex_t log_mutex;         // 日志保护互斥锁
} test_framework_t;

// 命令处理函数指针类型
typedef test_result_t (*cmd_handler_t)(const test_command_t *cmd);

// 命令处理表项
typedef struct {
    cmd_type_t type;
    const char *cmd_string;
    const char *description;
    cmd_handler_t handler;
} cmd_handler_entry_t;

// 全局变量声明
extern test_framework_t g_test_framework;

// 函数声明
// 框架初始化和清理
int test_framework_init(void);
void test_framework_cleanup(void);
int test_framework_start(void);
void test_framework_stop(void);

// 命令队列操作
int cmd_queue_init(cmd_queue_t *queue);
void cmd_queue_cleanup(cmd_queue_t *queue);
int cmd_queue_push(cmd_queue_t *queue, const test_command_t *cmd);
int cmd_queue_pop(cmd_queue_t *queue, test_command_t *cmd);
int cmd_queue_is_empty(cmd_queue_t *queue);
int cmd_queue_is_full(cmd_queue_t *queue);

// 命令解析和处理
cmd_type_t parse_command_type(const char *cmd_str);
int parse_command_parameters(const char *input, test_command_t *cmd);
test_result_t process_command(const test_command_t *cmd);

// 具体命令处理函数
test_result_t handle_photo_command(const test_command_t *cmd);
test_result_t handle_record_command(const test_command_t *cmd);
test_result_t handle_rtsp_command(const test_command_t *cmd);
test_result_t handle_wifi_command(const test_command_t *cmd);
test_result_t handle_ota_command(const test_command_t *cmd);
test_result_t handle_status_command(const test_command_t *cmd);
test_result_t handle_help_command(const test_command_t *cmd);

// 线程函数
void* command_parser_thread(void *arg);
void* command_processor_thread(void *arg);
void* monitor_thread(void *arg);

// 工具函数
void print_timestamp(void);
void log_message(const char *level, const char *format, ...);
void print_help(void);
void print_status(void);
const char* get_result_string(test_result_t result);
const char* get_thread_status_string(thread_status_t status);

// 信号处理
void signal_handler(int sig);
void setup_signal_handlers(void);

// 非阻塞输入检测
int check_stdin_ready(void);

// 后台服务相关
int start_background_service(void);
void stop_background_service(void);
int send_command_to_service(const char *cmd);
int is_service_running(void);

// 命名管道通信
#define FIFO_SERVER_PATH "/tmp/ai_glass_server"
#define FIFO_CLIENT_PATH "/tmp/ai_glass_client"
#define MAX_FIFO_MSG_LEN 512

#endif // TEST_FRAMEWORK_H